package ar.edu.utn.frsf.tpae.a2014.g02.persistence.dao.impl;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import ar.edu.utn.frsf.tpae.a2014.g02.persistence.dao.PedidoDao;
import ar.edu.utn.frsf.tpae.a2014.g02.persistence.model.EstadoPedido;
import ar.edu.utn.frsf.tpae.a2014.g02.persistence.model.HistorialPedido;
import ar.edu.utn.frsf.tpae.a2014.g02.persistence.model.Pedido;

/**
 * DAO de Pedido basado en Hibernate.
 * 
 * @author TPAE
 */
public class PedidoHibernateDao implements PedidoDao {

	private SessionFactory sessionFactory = new AnnotationConfiguration()
			.configure().buildSessionFactory();

	public Pedido nuevoPedido(Pedido pedido, Date fechaCambio,
			String comentarios) {
		Session session = sessionFactory.openSession();
		session.beginTransaction();

		HistorialPedido historial = new HistorialPedido();
		historial.setComentarios(comentarios);
		historial.setFechaHoraCambioEstado(fechaCambio);
		historial.setFechaHoraRegistroCambio(new Date());
		historial.setEstado(EstadoPedido.ACEPTADO);
		historial.setPedido(pedido);
		session.saveOrUpdate(pedido);
		session.saveOrUpdate(historial);
		session.getTransaction().commit();
		session.close();
		return pedido;
	}

	@SuppressWarnings("unchecked")
	public List<Pedido> listar() {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from " + Pedido.class.getName());
		return query.list();
	}

	public List<Pedido> listarSegunEstado(EstadoPedido estadoPedido) {
		// TODO implementar
		return null;
	}

	public List<Pedido> listarPedidosSinAsignar() {
		// TODO Auto-generated method stub
		return null;
	}

	public List<Pedido> listarOrdenesAsignadas() {
		// TODO Auto-generated method stub
		return null;
	}

	public Pedido persistir(Pedido pedido) {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		session.saveOrUpdate(pedido);
		session.getTransaction().commit();
		session.close();
		return pedido;
	}

	public void deleteAll() {
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		Query query = session.createQuery("delete from "
				+ HistorialPedido.class.getName());
		query.executeUpdate();
		Query query2 = session.createQuery("delete from "
				+ Pedido.class.getName());
		query2.executeUpdate();
		session.getTransaction().commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	@Override
	public EstadoPedido getEstadoPedidoById(Integer idPedido) {
		Session session = sessionFactory.openSession();
		Query query = session.createQuery("from "
				+ HistorialPedido.class.getName() 
				+ " as historial "
				+ " where historial.pedido.id = :idPedido"
				+ " order by historial.fechaHoraRegistroCambio DESC");
		query.setParameter("idPedido", idPedido);
		List<HistorialPedido> historial = (List<HistorialPedido>) query.list();
		return historial.get(0).getEstado();
	}
}
